package com.itheima.reggie.web.controller.ui;

import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.itheima.reggie.entity.User;
import com.itheima.reggie.service.UserService;
import com.itheima.reggie.utils.SMSUtil;
import com.itheima.reggie.utils.ValidateCodeUtil;
import com.itheima.reggie.web.R;
import com.itheima.reggie.web.exception.BusinessException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpSession;
import java.util.Map;

/**
 * C端用户控制器类
 *
 * @Author Vsunks.v
 * @Blog blog.sunxiaowei.net/996.mba
 * @Description: 前台用户控制器
 */
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;


    @Autowired
    HttpSession session;

    @Value("${sendMsg}")
    private boolean sendMsg;

    /**
     * 接收手机号，发送验证码
     *
     * @param user 包含手机号的实体对象
     * @return 是否发送成功
     */
    @PostMapping("/sendMsg")
    public R<Integer> sendMsg(@Validated @RequestBody User user) {
        // 记录日志
        String phone = user.getPhone();
        log.info("C端用户请求发送验证码，目标手机号为：[ {} ]", phone);

        // 参数校验

        // 生成验证码
        Integer code = ValidateCodeUtil.generateValidateCode(4);
        log.info("本次登录验证码为：[ {} ]", code);

        if (sendMsg) {
            // 发送验证码
            SMSUtil.sendMessage(phone, code + "");
        }

        // 保存验证码到session，以便登录请求时校验比对使用
        session.setAttribute(phone + "", code + "");


        // 响应数据
        return R.success("发送验证码成功", code);
    }


    /**
     * C端用户登录，使用手机号 + 验证码
     * <p>
     * 首次登录会自动完成注册
     *
     * @param map 手机号+验证码
     * @return 是否登录成功
     */
    @PostMapping("/login")
    public R login(@RequestBody Map<String, String> map) {
        // 1. 获取请求参数中的手机号和验证码
        String phone = map.get("phone");
        String code = map.get("code");

        // 2. session中获取验证码，key为手机号
        String codeInSession = (String) session.getAttribute(phone);

        // 3. 判断获取的验证码是否为空，为空则表示手机号有问题
        if (codeInSession == null) {
            throw new BusinessException("小伙子，别抖机灵！用自己的手机号玩。");
        }

        // 4. 判断两个验证码是否相同，相同则登录
        if (!codeInSession.equals(code)) {
            throw new BusinessException("验证码错误，请重新获取后再试");
        }

        // 5. 判断该手机号是否首次登录
        User userInDb = userService.getOne(Wrappers.lambdaQuery(User.class).eq(User::getPhone, phone));

        if (userInDb == null) {
            userInDb = new User();
            userInDb.setPhone(phone);
            userInDb.setStatus(1);
            // 6. 如果是首次登录，需要完成基本数据注册
            userService.save(userInDb);
        }

        // 7. 将登录信息保存到session中，key为user
        session.setAttribute("user", userInDb);
        session.removeAttribute(phone);

        // 8. 响应登录成功
        return R.success("登录成功", userInDb);
    }


}
